package v1

import (
	"github.com/gin-gonic/gin"
	"net/http"
	"gin-blog/models"
	"gorm.io/gorm"
	"gorm.io/driver/mysql"
	"gin-blog/pkg/setting"
	"fmt"
)

var db *gorm.DB

func init() {
	// 初始化数据库连接
	dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		setting.Config.Database.User,
		setting.Config.Database.Password,
		setting.Config.Database.Host,
		setting.Config.Database.Name)
	
	var err error
	db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic("failed to connect database")
	}
}

// GetTags 获取标签列表
// @Summary 获取所有标签
// @Tags 标签管理
// @Produce json
// @Success 200 {object} []models.Tag
// @Router /tags [get]
func GetTags(c *gin.Context) {
	var tags []models.Tag
	result := db.Find(&tags)
	if result.Error != nil {
		c.JSON(http.StatusInternalServerError, gin.H{
			"error": "查询标签失败",
			"msg": "查询标签失败",
		})
		return
	}
	
	c.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg": "success",
		"data": tags,
	})
}

// AddTag 新增文章标签
// @Summary 创建新标签
// @Tags 标签管理
// @Accept json
// @Produce json
// @Param tag body models.Tag true "标签信息"
// @Success 200 {object} gin.H
// @Router /tags [post]
func AddTag(c *gin.Context) {
	var tag models.Tag
	if err := c.ShouldBindJSON(&tag); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	
	result := db.Create(&tag)
	if result.Error != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "创建标签失败"})
		return
	}
	
	c.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg": "创建成功",
		"data": tag,
	})
}

// EditTag 修改文章标签
// @Summary 修改标签
// @Tags 标签管理
// @Accept json
// @Produce json
// @Param id path int true "标签ID"
// @Param tag body models.Tag true "标签信息"
// @Success 200 {object} gin.H
// @Router /tags/{id} [put]
func EditTag(c *gin.Context) {
	id := c.Param("id")
	var tag models.Tag
	
	if err := db.First(&tag, id).Error; err != nil {
		c.JSON(http.StatusNotFound, gin.H{"error": "标签不存在"})
		return
	}
	
	if err := c.ShouldBindJSON(&tag); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	
	db.Save(&tag)
	c.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg": "更新成功",
		"data": tag,
	})
}

// DeleteTag 删除文章标签
// @Summary 删除标签
// @Tags 标签管理
// @Produce json
// @Param id path int true "标签ID"
// @Success 200 {object} gin.H
// @Router /tags/{id} [delete]
func DeleteTag(c *gin.Context) {
	id := c.Param("id")
	result := db.Delete(&models.Tag{}, id)
	if result.Error != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "删除失败"})
		return
	}
	
	c.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg": "删除成功",
	})
}